#include <iostream>
#include <cstring>
#include <queue>

using namespace std;

typedef pair<int, int> PII;

const int N = 55;
int T, n, m;
int dx[] = {0, 0, 1, -1};
int dy[] = {1, -1, 0, 0}; 

char a[N][N];
int cnt;
bool st[N][N];
int g[N][N];

void bfs(int x, int y, int cnt)
{
	queue<PII> q;
	q.push({x, y});
	st[x][y] = true;
	g[x][y] = cnt;
	while(q.size())
	{
		auto t = q.front(); q.pop();
		int cx = t.first, cy = t.second;
		for(int k = 0; k < 4; k++)
		{
			int nx = cx + dx[k], ny = cy + dy[k];
			if(nx < 1 || ny < 1 || nx > n || ny > m) continue;
			if(a[nx][ny] == '0') continue;
			if(st[nx][ny]) continue;
			st[nx][ny] = true;
			g[nx][ny] = cnt;
			q.push({nx, ny});
		}
	}
}

bool is_subset(int x, int y, int cnt)
{
	if(x == 1 || y == 1 || x == n || y == m) return true;
	st[x][y] = true;
	for(int i = -1; i <= 1; i++)
	{
		for(int j = -1; j <= 1; j++)
		{
			int nx = x + i, ny = y + j;
			if(nx >= 1 && ny >= 1 && nx <= n && ny <= m && st[nx][ny] == false)
			{
				if(g[nx][ny] == cnt || a[nx][ny] == '0')
				{
					if(is_subset(nx, ny, cnt)) return true;
				}
			}
		}
	}

	return false;
}

int main()
{
	cin >> T;
	while(T--)
	{
		cin >> n >> m;
		memset(st, 0, sizeof st);
		memset(g, 0, sizeof g);
		cnt = 0;
		for(int i = 1; i <= n; i++)
			for(int j = 1; j <= m; j++)
				cin >> a[i][j];
		for(int i = 1; i <= n; i++)
			for(int j = 1; j <= m; j++)
			{
				if(a[i][j] != '1' || st[i][j]) continue;
				cnt++;
				bfs(i, j, cnt);
			}
			
//			for(int i = 1; i <= n; i++)
//			{
//				for(int j = 1; j <= m; j++)
//				{
//					cout << g[i][j] << " ";
//				}
//				cout << endl;
//			}
//			cout << cnt << endl;
			
		int ans = cnt;
		for(int i = 1; i <= n; i++)
		{
			for(int j = 1; j <= m; j++)
			{
			for(int k = 1; k <= cnt; k++)
				{
					if(g[i][j] == cnt)
					{
						memset(st, 0, sizeof st);
						if(!is_subset(i, j, cnt))
						{
							cout << cnt << endl; 
							 ans--;
							 break;
						}
						
					}
				}
			}
		}
		cout << ans << endl;
	}
	return 0;
}
